<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
        console.log("" + 1 + 0); // 将空字符串与数字 1 进行字符串连接得到"1"，再与数字 0 连接，结果为 "10"， 字符串连接
        console.log("" - 1 + 0); // 空字符串会被转换为数字 0，然后进行算术运算 0 - 1 得到 -1，再与 0 连接，结果为 -1，进行算术运算，""转换为 0
        console.log(true + false); // true 转换为数字 1，false 转换为数字 0，1 + 0 结果为 1，进行算术运算，true 转换为 1，false 转换为 0
        console.log(6 / "3"); // "3"被转换为数字 3，6 除以 3 结果为 2
        console.log("2" * "3"); // "2"和"3"都被转换为数字，2 * 3 结果为 6
        console.log(4 + 5 + "px"); // 4 + 5 得到 9，再与字符串"px"连接，结果为"9px"
        console.log("$" + 4 + 5); // 先将"$"与 4 连接得到"$4"，再与 5 连接，结果为"$45"
        console.log("4" - 2); // "4"被转换为数字 4，4 - 2 结果为 2
        console.log("4px" - 2); // "4px"无法转换为数字，结果为 NaN

        console.log();
        console.log("  -9  " + 5); // 字符串"  -9  "与数字 5 连接，结果为"-95"
        console.log("  -9  " - 5); // 字符串"  -9  "被转换为数字 -9，-9 - 5 结果为 -14
        console.log(null + 1); // null 转换为数字 0，0 + 1 结果为 1
        console.log(undefined + 1); // undefined 无法转换为数字，结果为 NaN
        console.log(" \t \n" - 2); // 只包含空白字符的字符串被转换为数字 0，0 - 2 结果为 -2
        console.log(0 == true); // 0 与 true（转换为数字 1）进行相等比较，结果为 false
        console.log(1 == true); // 1 与 true（转换为数字 1）进行相等比较，结果为 true
        console.log(1 === true); // 严格相等比较，1 和 true 的类型不同，结果为 false
        console.log("a" == false); // "a"与 false（转换为数字 0）进行相等比较，结果为 false
        console.log("" == false); // 空字符串与 false（转换为数字 0）进行相等比较，结果为 true

        console.log();
        console.log("" === false); // 严格相等比较，空字符串和 false 的类型不同，结果为 false
        console.log(undefined == null); // undefined 和 null 进行相等比较，结果为 true
        console.log(undefined === null); // 严格相等比较，结果为 false
        console.log();
        console.log(!3); // 3 为真值，取反后为 false
        console.log(!!3); // 3 为真值，两次取反后为 true
        console.log(123 || null || "abc"); // 123 为真值，直接返回，不再检查后面的值，结果为 123
        console.log(0 || null || "abc"); // 0 为假值，继续检查 null 也为假值，最后"abc"为真值，结果为"abc"
        console.log(0 || null || undefined); // 0 和 null 都是假值，undefined 也是假值，结果为 undefined
        console.log(123 && null && "abc"); // 123 为真值，但 null 为假值，短路运算不再检查后面的值，结果为 null
        console.log(0 && null && "abc"); // 0 为假值，短路运算不再检查后面的值，结果为 0
        console.log(123 && [] && "abc"); // 123 为真值，[] 为真值，继续检查"abc"也为真值，但返回最后检查的值，结果为"abc"
        console.log(123?? "abc"); // 123 不为 null 或 undefined，直接返回 123
        console.log(null?? "abc"); // null 为 null，返回"abc"
    </script>
  </body>
</html>
